import apis from '@/http' 					// 自己封装的网络请求类，也可以直接使用uni.request  
import global from '@/utils/global.js'		// 全局变量，有公众号appid
import store from '@/store'					// vuex储存
// #ifdef  H5
var jweixin = require('jweixin-module');	// 导入jssdk
// #endif

export default {  
    //判断是否在微信中访问页面  
    isWxmp: function(){  
        var ua = window.navigator.userAgent.toLowerCase();  
        if(ua.match(/micromessenger/i) == 'micromessenger'){  
            return true;  
        }else{  
            return false;  
        }  
    },
	// 获取微信公众号授权码
	getWxMpCode: function(url){
		var authUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${global.WxMpAppId}&redirect_uri=${encodeURIComponent(location.href)}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`;
		if(url){
			url = global.WebSiteUrl+url;
			authUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${global.WxMpAppId}&redirect_uri=${encodeURIComponent(url)}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`;
		}
		window.location.href = authUrl;
	},
	// 获取用OpenId存放在stone中
	getOpenId(that) {
		// 微信登录，并没有openId
		if (that.$wechat && !that.$store.getters.openId) {
			// #ifdef  H5
			if (!that.$Route.query.code) {
				// 若没有授权码，则请求授权码
				that.$wechat.getWxMpCode();
			} else {
				that.$apis.getOpenId({
					params: {
						type: 'WXMP',
						appId: that.$global.WxMpAppId,
						code: that.$Route.query.code
					},
					needToken: false
				}).then(res => {
					that.$store.commit('SET_OPENID', res.data);
				}).catch(err => {
					if (err == 'code been used') {
						// 授权码已经使用过，则重新请求
						that.$wechat.getWxMpCode("/");
					} else {
						uni.showToast({title: err, icon: 'none', duration: 3000});
					}
				});
			}
			// #endif
			// #ifdef MP-WEIXIN
			uni.login({
				provider: 'weixin',
				success: (loginRes) => {
					that.$apis.getOpenId({
						params: {
							type: 'WXMA',
							appId: that.$global.WxMaAppId,
							code: loginRes.code
						},
						needToken: false
					}).then(res => {
						that.$store.commit('SET_OPENID', res.data);
					}).catch(err => {
						uni.showToast({title: err, icon: 'none', duration: 3000});
					});
				},
				fail: (res) => {
					console.log(res)
				}
			});
			// #endif
		}
	},
	// 微信访问，授权码自动登录，若第一次访问会自动创建用户
	wxUserVisit: function(code){
		// 如果连接中有微信返回的 code，则用此 code 调用后端接口，向微信服务器请求用户信息
		// 如果不是从微信重定向过来的，没有带着微信的code
		if (code && store.getters.user==null) {
			apis.wxMpLogin({ 
				params: {
					appId: global.WxMpAppId,
					code: code
				}, 
				needToken: false
			}).then(res =>{
				console.log(res);
				// 如果返回成功，表示该微信号有注册过用户，并绑定到该用户了，后端则直接登录，返回登录的用户信息,前端进行储存
				//将后台返回的token和user存在store
				store.commit('SET_TOKEN', res.data[0].token_type+" "+res.data[0].access_token);
				store.commit('SET_REFRESH_TOKEN', res.data[0].refresh_token);
				store.commit('SET_USER', res.data[1]);
			}).catch(err =>{
				console.log(err);
			});
		}
	},
    //初始化sdk配置  
    initJssdk:function(callback ,url){  
		// 若有传进来url，则用传进来的url，如果没有则需要判断是否是ios或者是Android
		// 微信安卓版，每次切换路由，SPA的url是会变的，所以用location.href
		// 微信IOS版，每次切换路由，SPA的url是不会变的，用初进入页面时的url，window.initUrl这个在路由切换中初始化了
		url = url ? url : (global.isIosOrAndroid() === 'android' ? location.href.split('#')[0] : window.initUrl);
		
        //服务端进行签名 ，可使用uni.request替换。 签名算法请看文档  
		apis.getJsSDKConfig({ 
			jointUrl: "/"+global.WxMpAppId,
			params: {
				url: url
			}, 
			needToken: false
		}).then(res =>{
			console.log(res)
			jweixin.config({  
				 debug: false,  
				 appId: res.data.appId,  
				 timestamp:res.data.timestamp,  
				 nonceStr: res.data.nonceStr,  
				 signature:res.data.signature,  
				 jsApiList: [  
					 'checkJsApi',
					 'openLocation',
					 'getLocation',
					 'scanQRCode',
					 'chooseImage',
					 'updateAppMessageShareData', 
					 'updateTimelineShareData'
				 ]
			});
			//配置完成后，再执行分享等功能的回调函数  
			if(callback){  
				callback(res.data);  
			}  
		}).catch(err =>{
			console.log(err)
			uni.showToast({ title: err, icon: 'none' });
		});  
    },  
    
	//在需要自定义分享的页面中调用  
    share:function(data ,url){
		if(!this.isWxmp()){
			console.log('不是微信客户端')
		    return ;  
		}
        //每次都需要重新初始化配置，才可以进行分享  
        this.initJssdk(function(signData){  
            jweixin.ready(function(){
				// H5分享只能是点击右上角分享
                var shareData = {  
					title: data && data.title ? data.title : "星洛IT教育",    		// 分享标题
					desc: data && data.desc ? data.desc : "星洛IT教育精选课程",  		// 分享描述
					link: window.location.href,  									// 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
					imgUrl: data && data.img ? data.img : "http://wx.qlogo.cn/mmopen/2IQODo57A8L8MHWC1eLEYCQZCzhXJNlKfMSibXvMppyTm0nbUbPU4SFHf4zlibicpSPf0vOzEtYiar0ou3cWbtuDxMNszP4pGykn/64",  		// 分享图标
					success: function (res) {  
						//用户点击分享后的回调，这里可以进行统计，例如分享送金币之类的  
						// request.post('/api/member/share');
						uni.showToast({ title: '点击左上角分享'});
					},
					cancel: function (res) {  
						console.log("取消分享")
					},
					// fail: function(res){
					// 	uni.showToast({ title: '分享失败:'+JSON.stringify(res), icon: 'none', duration: 10000 });
					// }
                 };  
                 //分享给朋友接口  
                 jweixin.updateAppMessageShareData(shareData);  
                 //分享到朋友圈接口  
                 jweixin.updateTimelineShareData(shareData);  
            });  
        } ,url);  
    },
	//在需要定位页面调用
	location: function(callback) {
		if (!this.isWxmp()) {
			console.log('不是微信客户端')
			return;
		}
		this.initJssdk(function(signData) {
			jweixin.ready(function() {
				jweixin.getLocation({
					type: 'gcj02', // 默认为wgs84的gps坐标，如果要返回直接给openLocation用的火星坐标，可传入'gcj02'
					success: function (res) {
						console.log(res);
						jweixin.openLocation({
							latitude: res.latitude, // 纬度，浮点数，范围为90 ~ -90
							longitude: res.longitude, // 经度，浮点数，范围为180 ~ -180。
							name: '你的位置', // 位置名
							address: '', // 地址详情说明
							scale: 15, // 地图缩放级别,整形值,范围从1~28。默认为最大
							infoUrl: '' // 在查看位置界面底部显示的超链接,可点击跳转
						});
						callback(res)
					},
					fail:function(res){
						console.log(res)
						uni.showToast({ title: '定位失败:'+JSON.stringify(res), icon: 'none'});
					}
				});
			});
		});
	},
	// 拍照或从手机相册中选图接口
	chooseImage: function(callback) {
		if (!this.isWxmp()) {
			console.log('不是微信客户端')
			return;
		}
		this.initJssdk(function(signData) {
			jweixin.ready(function() {
				jweixin.chooseImage({
					count: 1, // 默认9
					sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图，默认二者都有
					sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机，默认二者都有
					success: function (res) {
						var localIds = res.localIds; // 返回选定照片的本地ID列表，localId可以作为img标签的src属性显示图片
						callback(localIds)
					},
					fail: function(res){
						uni.showToast({ title: '选图失败:'+JSON.stringify(res), icon: 'none'});
					}
				});
			});
		});
	},
	
	
	
	//公众号请求统一下单接口获取js支付参数
	getWxMpPayInfo:function(params, callback){ 
		apis.getWxMpPayInfo({ 
			params: params, 
			needToken: true
		}).then(res =>{
			console.log(res)
			// 获取js支付参数之后，再执行支付功能的回调函数  
			if(callback){  
				callback(res.data);  
			}  
		}).catch(err =>{
			console.log(err)
			uni.showToast({ title: err, icon: 'none' });
		});  
	},
	// 微信支付
	onBridgeReady: function(payInfo, callback){
		WeixinJSBridge.invoke(
			'getBrandWCPayRequest', {
				"appId": payInfo.appId,                 //公众号名称，由商户传入
				"timeStamp": payInfo.timeStamp,         //时间戳，自1970年以来的秒数
				"nonceStr": payInfo.nonceStr,           //随机字符串
				"package": payInfo.packageValue,            //支付验证pay_id
				"signType":"MD5",                           //微信签名方式
				"paySign": payInfo.paySign                 //微信签名
			},
			function(res){
				if(res.err_msg == "get_brand_wcpay_request:ok" ){
					// 使用以上方式判断前端返回,微信团队郑重提示：
					//res.err_msg将在用户支付成功后返回ok，但并不保证它绝对可靠。
					callback("支付成功");
				}else if(res.err_msg == "get_brand_wcpay_request:fail" ){
					uni.showToast({ title: '支付失败', icon: 'none' });
				}else if(res.err_msg == "get_brand_wcpay_request:cancel" ){
					uni.showToast({ title: '取消支付', icon: 'none' });
				}
			}
		); 
	},
	/**
	 * 公众号请求微信支付的对外接口
	 * @param {Object} params	第一个参数是请求统一下单接口获取js支付参数的参数
	 * @param {Object} callback		第二个参数是支付成功后的回调函数
	 */
	wxMpPay(params, callback){
		if (!this.isWxmp()) {
			console.log('不是微信客户端')
			return;
		}
		let that = this;
		this.getWxMpPayInfo(params, function(payInfo) {
			if (typeof WeixinJSBridge == "undefined"){
			   if( document.addEventListener ){
					document.addEventListener('WeixinJSBridgeReady', () => {
						that.onBridgeReady(payInfo, callback);
					}, false);
			   }else if (document.attachEvent){
					document.attachEvent('WeixinJSBridgeReady', () => {
						that.onBridgeReady(payInfo, callback);
					}); 
					document.attachEvent('onWeixinJSBridgeReady', () => {
						that.onBridgeReady(payInfo, callback);
					});
			   }
			}else{
				that.onBridgeReady(payInfo, callback);
			}
		});
	},
	
	
	//小程序请求统一下单接口获取js支付参数
	getWxMaPayInfo:function(params, callback){ 
		apis.getWxMaPayInfo({ 
			params: params, 
			needToken: true
		}).then(res =>{
			console.log(res)
			// 获取js支付参数之后，再执行支付功能的回调函数  
			if(callback){  
				callback(res.data);  
			}  
		}).catch(err =>{
			console.log(err)
			uni.showToast({ title: err, icon: 'none' });
		});  
	},
	/**
	 * 小程序请求微信支付的对外接口
	 * @param {Object} params	第一个参数是请求统一下单接口获取js支付参数的参数
	 * @param {Object} callback		第二个参数是支付成功后的回调函数
	 */
	wxMaPay(params, callback){
		let that = this;
		this.getWxMaPayInfo(params, function(payInfo) {
			uni.requestPayment({
			    nonceStr: payInfo.nonceStr,　　　　　　//　　随机字符串　　　　【字符串】
			    package: payInfo.packageValue,　　　　　　　//　　统一下单接口 必须加前缀：prepay_id=xxxxxxxx  【字符串】
			    paySign: payInfo.paySign,　　　　　　　//　　签名     【字符串】
			    signType: payInfo.signType,　　　　　　//　　签名算法  【字符串】
			    timeStamp: payInfo.timeStamp,　　　　 //　　时间戳   【字符串】
			    success(res) {
					callback("支付成功");
				},
				fail(err) {
					console.log('支付失败提示 fail:' + JSON.stringify(err));
					if(err.errMsg == "requestPayment:fail cancel"){
						uni.showToast({ title: '取消支付', icon: 'none' });
					}else{
						uni.showToast({ title: '支付失败', icon: 'none' });
					}
				},
				complete(res){
					//console.log('xxxxxxxxxxxxxxxxxx---complete')
				}
			});
		});
	}
}